package com.rc.saas.tenant.shiro;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Created by sven on 2018-09-01
 */
public class OnlineSessionFilter extends AccessControlFilter {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 表示是否允许访问 ，如果允许访问返回true，否则false
     *
     * @param servletRequest
     * @param servletResponse
     * @param o
     * @return
     * @throws Exception
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        Subject subject = getSubject(servletRequest, servletResponse);
        if (subject == null || subject.getSession(false) == null) {
            return true;
        }

        //如果没有登录
        if (!subject.isAuthenticated() && !subject.isRemembered()) {
            logger.info("还没有登录");
            return false;
        }

        return true;
    }

    /**
     * onAccessDenied：表示当访问拒绝时是否已经处理了；如果返回 true 表示需要继续处理；如果返回 false 表示该拦截器实例已经处理了，将直接返回即可。
     *
     * @param servletRequest
     * @param servletResponse
     * @return
     * @throws Exception
     */
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
        //当 isAccessAllowed 返回 false 的时候，才会执行 method onAccessDenied

        // 返回 false 表示已经处理，例如页面跳转啥的，表示不在走以下的拦截器了（如果还有配置的话）
        return false;
    }
}
